#!/bin/sh

# cryptdisks_start - wrapper around cryptsetup which parses
# /etc/crypttab, just like mount parses /etc/fstab.

# Initial code and (c) 2007 Jon Dowland <jon@alcopop.org>
# License: GNU General Public License, v2 or any later
# (https://www.gnu.org/copyleft/gpl.html)

set -e

. /lib/cryptsetup/cryptdisks-functions

INITSTATE="manual"
DEFAULT_LOUD="yes"
FORCE_START="yes"

usage() {
    local rv="${1:-1}"
    echo "Usage: $0 [-r|--readonly] <name> [.. <name>]" >&2
    echo >&2
    echo "reads $TABFILE and starts the mapping corresponding to <name>" >&2
    exit $rv
}

CRYPTTAB_EXTRA_OPTIONS=
while [ $# -gt 0 ]; do
    case "$1" in
        -r|--readonly) CRYPTTAB_EXTRA_OPTIONS="${CRYPTTAB_EXTRA_OPTIONS:+$CRYPTTAB_EXTRA_OPTIONS,}readonly";;
        -h|--help|-\?) usage 0;;
        --) shift; break;;
        -*) echo "Error: unknown option '$1'" >&2; usage 1;;
        *) break;;
    esac
    shift
done
[ $# -gt 0 ] || usage 1

if [ $(id -u) -ne 0 ]; then
    log_warning_msg "$0 needs root privileges"
    exit 1
fi

log_action_begin_msg "Starting crypto disk"
mount_fs

rv=0
for name in "$@"; do
    if ! crypttab_find_entry --quiet "$name"; then
        device_msg "$name" "failed, not found in crypttab"
        rv=1
    else
        if [ -n "$CRYPTTAB_EXTRA_OPTIONS" ]; then
            CRYPTTAB_OPTIONS="$CRYPTTAB_OPTIONS,$CRYPTTAB_EXTRA_OPTIONS"
            _CRYPTTAB_OPTIONS="$_CRYPTTAB_OPTIONS,$CRYPTTAB_EXTRA_OPTIONS"
        fi
        setup_mapping || rv=$?
    fi
done
umount_fs

log_action_end_msg $rv
exit $rv
